package com.powernode.service.impl;

import com.powernode.constant.RedisConstant;
import com.powernode.entity.AppUserGroup;
import com.powernode.mapper.AppUserGroupMapper;
import com.powernode.service.AppUserGroupService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 初始化权限和资源对应关系到redis库中，也可以实现CommandLineRunner或者ApplicationRunner接口，两者都是spring boot项目启动时用于数据初始化的
 * @author Juice
 * @since 2023-02-08
 */
@Service
public class AppUserGroupServiceImpl extends ServiceImpl<AppUserGroupMapper, AppUserGroup> implements AppUserGroupService {


    @Autowired
    private RedisUtil redisUtil;
    /**
     * 构造方法执行之后执行的方法，将角色资源对应关系初始化到redis
     */
    @PostConstruct
    public void initRedisData(){
        // 创建一个map用于存放数据
        Map<String,Object> map = new HashMap<>();
        // 先删除redis中的数据
        redisUtil.del(RedisConstant.KEY_AUTH_GROUP_RESOURCE);
        // 遍历用户组
        this.list().forEach(group -> {
            // 遍历每个组中的资源列表
            group.getResources().forEach( uri -> {
                // 根据map中的key，即资源地址获取对应权限集合
                Set<String> set = (HashSet<String>) map.get(uri);
                if (set == null) {
                    set = new HashSet<>();
                }
                // 向权限集合中添加当前遍历的资源
                set.add(group.getGroupName());
                map.put(uri,set);
            });
        });
        // 添加权限-资源对应关系到redis库中
        redisUtil.hmset(RedisConstant.KEY_AUTH_GROUP_RESOURCE,map);
    }
}
